/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.DAO;

import com.DAO.ConexaoPostgreSQL.ConnectionFactory;
import com.Model.Acervo;
import com.Model.AcervoCampo;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Fellipe
 */
public class AcervoDAO {

    private Connection con = new ConnectionFactory().getConnection();
    private PreparedStatement pstm;

    public void create(Acervo a) {

        int chaveAcervo;
        int ativo = 1;
        int publicavel = (a.getPublicavel()) ? 1 : 0;
        Integer chaveUsuario = null; //a.getUsuario().getChaveUsuario();
        String descricao = null;
        if (!a.getDescricao().isEmpty()) {
            descricao = a.getDescricao();
        }
        Long data = null;
//        if (a.getData().isEmpty()) {
//            data = "'" + a.getData() + "'";
//        }
        List<AcervoCampo> listaAcervoCampos = a.getAcervoCampo();

        try {

            con.setAutoCommit(false);

            String sql = "SELECT MAX(chaveacervo) AS maior FROM acervo";
            pstm = con.prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            rs.next();
            chaveAcervo = rs.getInt("maior") + 1;

            sql = "INSERT INTO acervo VALUES ( ?, ? ,?, ? ,? ,? )";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chaveAcervo);
            pstm.setString(2, descricao);
            pstm.setInt(3, publicavel);
            if (data == null) {
                pstm.setNull(4, java.sql.Types.DATE);
            } else {
                pstm.setDate(4, new Date(data));
            }
            if (chaveUsuario == null) {
                pstm.setNull(5, java.sql.Types.INTEGER);
            } else {
                pstm.setInt(5, chaveUsuario);
            }
            pstm.setInt(6, ativo);
            pstm.execute();

            int cont = 0;
            for (AcervoCampo ac : listaAcervoCampos) {
                ac.setChaveAcervo(chaveAcervo);
                ac.setChaveCampo(ac.getCampo().getChaveCampo());
                ac.setSequencia(cont);
                cont++;
                new AcervoCampoDAO().create(ac);
            }
            con.setAutoCommit(true);

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public List<Acervo> readNomes() {

        List<Acervo> listaAcervos = new ArrayList<Acervo>();

        try {
            String sql = "SELECT * FROM acervo WHERE ativo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, 1);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                Acervo a = new Acervo();

                a.setChaveAcervo(rs.getInt("chaveacervo"));
                a.setDescricao(rs.getString("descricao"));

                listaAcervos.add(a);
            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return listaAcervos;

    }

    public Acervo read(int chave) {

        Acervo a = new Acervo();

        try {
            String sql = "SELECT * FROM acervo WHERE chaveAcervo = ? AND ativo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chave);
            pstm.setInt(2, 1);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                a.setChaveAcervo(rs.getInt("chaveacervo"));
                a.setData(rs.getString("data"));
                a.setDescricao(rs.getString("descricao"));
                a.setPublicavel(rs.getBoolean("publicavel"));
//                a.setUsuario(null);
                a.setAcervoCampo(new AcervoCampoDAO().read(a.getChaveAcervo().toString()));

            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return a;

    }

    public void update(Acervo a) {

        int chaveAcervo = a.getChaveAcervo();
        int ativo = 1;
        int publicavel = (a.getPublicavel()) ? 1 : 0;
        int chaveUsuario = 0; //a.getUsuario().getChaveUsuario();
        String descricao = null;
        if (!a.getDescricao().isEmpty()) {
            descricao = a.getDescricao();
        }
        String data = null;
//        if (a.getData().isEmpty()) {
//            data = "'" + a.getData() + "'";
//        }
        List<AcervoCampo> listaAcervoCampos = a.getAcervoCampo();

        try {

            String sql = "UPDATE acervo SET descricao = ?, publicavel = ?, data = ?, chaveUsuario = ? WHERE chaveacervo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setString(1, descricao);
            pstm.setInt(2, publicavel);
            pstm.setString(3, data);
            pstm.setInt(4, chaveUsuario);
            pstm.setInt(5, chaveAcervo);
            pstm.execute();

            for (AcervoCampo ac : listaAcervoCampos) {

                new AcervoCampoDAO().update(ac);

            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public void delete(int chaveAcervo) {

        try {

            String sql = "UPDATE acervo SET ativo = ? WHERE chaveacervo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, 0);
            pstm.setInt(2, chaveAcervo);
            pstm.execute();

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public List<Acervo> buscaNome(String nome) {

        List<Acervo> listaAcervos = new ArrayList<Acervo>();

        try {
            System.out.println(nome);
            String sql = "SELECT * FROM acervo WHERE descricao LIKE ? AND ativo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setString(1, "%" + nome + "%");
            pstm.setInt(2, 1);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                Acervo a = new Acervo();

                a.setChaveAcervo(rs.getInt("chaveacervo"));
                a.setDescricao(rs.getString("descricao"));

                listaAcervos.add(a);
            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return listaAcervos;
    }
}
